#! /bin/sh
#		Written by Miquel van Smoorenburg <miquels@cistron.nl>.
#		Modified for Debian GNU/Linux
#		by Ian Murdock <imurdock@gnu.ai.mit.edu>.
#               Clamav version by Magnus Ekdahl <magnus@debian.org>
#		Nagios version by Sean Finney <seanius@debian.org> and probably others
#		nagios2 version by Marc Haber <mh+debian-packages@zugschlus.de>
#		nagios3 version by Alexander Wirt <formorer@debian.org>

### BEGIN INIT INFO
# Provides:          nagios3
# Required-Start:    $local_fs $remote_fs $syslog $named $network $time
# Required-Stop:     $local_fs $remote_fs $syslog $named $network
# Should-Start:      
# Should-Stop:       
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: nagios host/service/network monitoring and management system
# Description:       nagios is a monitoring and management system for hosts, services and networks.
### END INIT INFO

set -e

. /lib/lsb/init-functions

DAEMON=/usr/sbin/nagios3
NAME="nagios3"
DESC="nagios3 monitoring daemon"
NAGIOSCFG="/etc/nagios3/nagios.cfg"
CGICFG="/etc/nagios3/cgi.cfg"
NICENESS=5
COLOS=""

[ -x "$DAEMON" ] || exit 0
[ -r /etc/default/nagios3 ] && . /etc/default/nagios3


# this is from madduck on IRC, 2006-07-06
# There should be a better possibility to give daemon error messages
# and/or to log things
log()
{
  case "$1" in
    [[:digit:]]*) success=$1; shift;;
    *) :;;
  esac
  log_action_begin_msg "$1"; shift
  log_action_end_msg ${success:-0} "$*"
}

check_started () {
	if [ -e $CGICFG ];
	then
		check_cmd=$(get_config nagios_check_command $CGICFG)
		if [ ! "$check_cmd" ]; then
			log 6 "unable to determine nagios_check_command from $CGICFG!" 
			return 6
		fi
	else 
		#use hardcoded default version
		check_cmd="/usr/lib/nagios/plugins/check_nagios /var/cache/nagios3/status.dat 5 '/usr/sbin/nagios3'"
	fi

  eval $check_cmd >/dev/null
		
  if [ -f "$THEPIDFILE" ]; then
    pid="$(cat $THEPIDFILE)"
    if [ "$pid" ] && kill -0 $pid >/dev/null 2>/dev/null; then
      return 0    # Is started
    fi
  fi
  return 1	# Isn't started
}

#######################################################################################################
# AST magic below

ast_config_dl ()
{
        echo -n "Downloading config from ${AST_URL}:"
	mv -f ${NAGIOS_COLO} ${NAGIOS_COLO}.old
	for i in $COLOS
	do
	        ${CURL} ${AST_URL}$HOSTNAME.${i} >> ${NAGIOS_COLO} 2>> $STARTUP_CHECK
        	if [ $? -eq 0 ]; then
                	echo " done."
        	else
                	echo "Fetch AST config failed."
        	fi
	done
}

# AST server
AST_SVR=""
# hostname
HOSTNAME=`/bin/hostname`
# ast url to fetch config
AST_URL="https://${AST_SVR}/nagios_host_groups/build_hostgroup/1/?src="
# detination file
NAGIOS_COLO=/etc/nagios3/conf.d/colo/colo.cfg
# nagios cfg
NAGIOS_CFG=/etc/nagios3/nagios.cfg
# CURL and options, fil in username and password
CURL="/usr/bin/curl -k -s -u USER:PASSWORD"
# Restart log
STARTUP_CHECK="/etc/nagios3/startup_check.log"

# Output when config has error
ast_error_output ()
{
        echo "CONFIG ERROR!  Start aborted.  Check your Nagios configuration."
        echo "Copy bad config to .bad"
        cp ${NAGIOS_COLO} ${NAGIOS_COLO}.bad
        echo "Reverting to last good config"
        cp ${NAGIOS_COLO}.good ${NAGIOS_COLO}
        echo "See the error with 'cat ${STARTUP_CHECK}'"
        echo "You can restart nagios without downloading AST by doing '$0 restart -no_ast'"

}

# Capture second parameter
AST_FLAG=$2
#######################################################################################################
#
#	get_config()
#
#	grab a config option from nagios.cfg (or possibly another nagios config
#	file if specified).  everything after the '=' is echo'd out, making
#	this a nice generalized way to get requested settings.
#
get_config () {
  if [ "$2" ]; then
    set -- `grep ^$1 $2 | sed 's@=@ @'`
  else
    set -- `grep ^$1 $NAGIOSCFG | sed 's@=@ @'`
  fi
  shift
  echo $*
}

check_config () {
  if $DAEMON -v $NAGIOSCFG ${STARTUP_CHECK} 2>&1; then
    # First get the user/group etc Nagios is running as
    nagios_user="$(get_config nagios_user)"
    nagios_group="$(get_config nagios_group)"
    log_file="$(get_config log_file)"
    log_dir="$(dirname $log_file)"
    cp ${NAGIOS_COLO} ${NAGIOS_COLO}.good
    return 0    # Config is ok
  else
    # config is not okay, so let's barf the error to the user
    $DAEMON -v $NAGIOSCFG
  fi
}

check_named_pipe () {
  nagiospipe="$(get_config command_file)"
  if [ -p "$nagiospipe" ]; then
    return 1   # a named pipe exists
  elif [ -e "$nagiospipe" ];then
    return 1
  else
    return 0   # no named pipe exists
  fi
}

if [ ! -f "$NAGIOSCFG" ]; then
  log_failure_msg "There is no configuration file for Nagios 3."
  exit 6
fi

THEPIDFILE=$(get_config "lock_file")
[ -n "$THEPIDFILE" ] || THEPIDFILE='/var/run/nagios3/nagios.pid'

start () {
  if [ "$AST_FLAG" != "-no_ast" ]; then
   ast_config_dl
  fi
  DIRECTORY=$(dirname $THEPIDFILE)
  [ ! -d $DIRECTORY ] && mkdir -p $DIRECTORY
  chown nagios:nagios $DIRECTORY

  if ! check_started; then
    if ! check_named_pipe; then
      log_action_msg "named pipe exists - removing"
      rm -f $nagiospipe
    fi
    if check_config; then
      start_daemon -n $NICENESS -p $THEPIDFILE $DAEMON -d $NAGIOSCFG
      ret=$?
    else
      log_failure_msg "errors in config!"
      log_end_msg 1
      exit 1
    fi
  else
    log_warning_msg "already running!"
  fi
  return $ret
}

stop () {
    killproc -p $THEPIDFILE
    ret=$?
    if [ `pidof nagios3 | wc -l ` -gt 0 ]; then
        echo -n "Waiting for $NAME daemon to die.."
        cnt=0
        while [ `pidof nagios3 | wc -l ` -gt 0 ]; do
            cnt=`expr "$cnt" + 1`
            if [ "$cnt" -gt 15 ]; then
                kill -9 `pidof nagios3`
                break
            fi
            sleep 1
            echo -n "."
        done
    fi
    echo
    if ! check_named_pipe; then
      rm -f $nagiospipe
    fi
    if [ -n "$ret" ]; then
      return $ret
    else
      return $?
    fi
}

status()
{
  log_action_begin_msg "checking $DAEMON"
  if check_started; then
    log_action_end_msg 0 "running"
  else
    if [ -e "$THEPIDFILE" ]; then
      log_action_end_msg 1 "$DAEMON failed"
      exit 1
    else
      log_action_end_msg 1 "not running"
      exit 3
    fi
  fi
}


reload () {
  # Check first
  if check_config; then
    if check_started; then
      killproc -p $THEPIDFILE $DAEMON 1 
    else
      log_warning_msg "Not running."
    fi
  else
    log_failure_msg "errors in config!"
    log_end_msg 6
    exit 6
 fi
}

status () {
   $DAEMON -v $NAGIOSCFG
}

case "$1" in
  start)
    log_daemon_msg "Starting $DESC" "$NAME"
    start
    log_end_msg $?
    ;;
  stop)
    log_daemon_msg "Stopping $DESC" "$NAME"
    stop
    log_end_msg $?
  ;;
  restart|reload|force-reload)
    log_daemon_msg "${1}ing $DESC" "$NAME"
    stop
    if [ -z "$?" -o "$?" = "0" ]; then
      start
    fi
    log_end_msg $?
  ;;
  status)
    status
    ;;
  check)
    check
    ;;
  *)
    log_failure_msg "Usage: $0 {start|stop|restart|reload|force-reload|status}" >&2
    exit 1
  ;;
esac

exit 0
